package com.advanced.strategy;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 *
 * 对分片键的后加上表位，避免扩容库表后的数据迁移
 */
public class CreateCodeSuffixTableConfig {

    /**
     * 存储表后缀集合
     */
    private static List<String> partitionTableSuffixList = new ArrayList<>();

    private static Random random = new Random();
    /**
     * 向集合中添加现有的表后缀，有3个表分别是0，1,a，所以集合就暂时存0,1,a
     * 该集合的作用就是把这条数据随机存到3个表中的其中一个。由于3个表的概率相同，所以数据量不会差太大
     */
    static {
        partitionTableSuffixList.add("0");
        partitionTableSuffixList.add("1");
        partitionTableSuffixList.add("a");
    }

    /**
     * 该集合是--->当要对表扩容的时候，无需迁移数据，只需设置权重即可，新表被随到的概率大于旧表，这样可以均衡刚扩容后的新旧表数据量差距大
     *
     * 该方法是最简单，最low的，如果想更华丽，可以借助redis，或者其他算法
     */
//    static {
//        partitionTableSuffixList.add("0");
//        partitionTableSuffixList.add("1");
//        partitionTableSuffixList.add("a");
//        partitionTableSuffixList.add("b");
//        partitionTableSuffixList.add("b");
//        partitionTableSuffixList.add("b");
//        partitionTableSuffixList.add("c");
//        partitionTableSuffixList.add("c");
//        partitionTableSuffixList.add("c");
//    }

    public static String getPartitionTableSuffix(){
        int suffix = random.nextInt(partitionTableSuffixList.size());
        return partitionTableSuffixList.get(suffix);
    }

}
